package com.halfsword.creativecraft.utils;

import net.minecraft.world.inventory.ContainerData;

/**
 * ContainerData读取器
 * 用于从ContainerData中顺序读取数据
 */
public class ContainerDataReader {
    private final ContainerData data;
    private int index = 0;

    /**
     * 构造函数
     * @param data 要读取的ContainerData
     */
    public ContainerDataReader(ContainerData data) {
        this.data = data;
    }

    /**
     * 读取一个整数值
     * @return 整数值
     */
    public int readInt() {
        if (index >= data.getCount()) {
            throw new IndexOutOfBoundsException("试图读取超出ContainerData范围的数据: " + index + " >= " + data.getCount());
        }
        return data.get(index++);
    }

    /**
     * 读取一个布尔值
     * @return 布尔值
     */
    public boolean readBoolean() {
        return readInt() != 0;
    }

    /**
     * 读取一个字节值
     * @return 字节值
     */
    public byte readByte() {
        return (byte) readInt();
    }

    /**
     * 读取一个短整型值
     * @return 短整型值
     */
    public short readShort() {
        return (short) readInt();
    }

    /**
     * 读取一个浮点值（乘以1000后存储为整数）
     * @return 浮点值
     */
    public float readFloat() {
        return readInt() / 1000.0f;
    }

    /**
     * 读取一个双精度浮点值（乘以1000后存储为整数）
     * @return 双精度浮点值
     */
    public double readDouble() {
        return readInt() / 1000.0;
    }

    /**
     * 获取当前读取位置
     * @return 当前读取位置
     */
    public int getPosition() {
        return index;
    }

    /**
     * 设置读取位置
     * @param position 新的读取位置
     */
    public void setPosition(int position) {
        if (position < 0 || position > data.getCount()) {
            throw new IndexOutOfBoundsException("无效的读取位置: " + position);
        }
        this.index = position;
    }

    /**
     * 跳过指定数量的字段
     * @param count 要跳过的字段数量
     */
    public void skip(int count) {
        setPosition(index + count);
    }

    /**
     * 重置读取位置到开始
     */
    public void reset() {
        index = 0;
    }

    /**
     * 检查是否还有更多数据可读
     * @return 是否还有更多数据
     */
    public boolean hasMore() {
        return index < data.getCount();
    }

    /**
     * 获取剩余可读字段数量
     * @return 剩余字段数量
     */
    public int remaining() {
        return data.getCount() - index;
    }

    /**
     * 读取一个枚举值
     * @param enumClass 枚举类
     * @param <T> 枚举类型
     * @return 枚举值
     */
    public <T extends Enum<T>> T readEnum(Class<T> enumClass) {
        int ordinal = readInt();
        T[] values = enumClass.getEnumConstants();
        if (ordinal < 0 || ordinal >= values.length) {
            return values[0]; // 返回默认值
        }
        return values[ordinal];
    }

    /**
     * 读取一个字符串（UTF-8编码，最多4个字符）
     * @return 字符串
     */
    public String readString() {
        int code = readInt();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < 4; i++) {
            int c = (code >> (i * 8)) & 0xFF;
            if (c != 0) {
                sb.append((char) c);
            }
        }
        return sb.toString();
    }
}